package doublelink

import (
	"fmt"
)

type HeroNode struct {
	no       int
	name     string
	nickname string
	pre      *HeroNode
	next     *HeroNode
}

// 给双向链表插入一个结点
// 编写第一种插入方法，在单链表的最后加入，
func (head *HeroNode) InserHeroNode(newHerNode *HeroNode) {
	//先找到该链表的最后一个结点
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	for {
		if temp.next == nil { //表示找到最后
			break
		}
		temp = temp.next //让temp不断的指向下一个结点
	}
	//将newHeroNode加入到链表的最后
	temp.next = newHerNode
	newHerNode.pre = temp
}

// 给链表插入一个结点
// 编写第二种插入方法，根据no的编号从小到大插入
func (head *HeroNode) InserHeroNode2(newHerNode *HeroNode) {
	//先找到该链表的最后一个结点
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	//让插入的结点no，和temp的下一个结点的no比较
	flag := true
	for {
		if temp.next == nil { //表示找到最后
			break
		} else if temp.next.no > newHerNode.no {
			//说明应该插入到这里
			break
		} else if temp.next.no == newHerNode.no {
			//说明我们链表中已经有了，不能插入
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("不能添加")
		return
	} else {
		newHerNode.next = temp.next
		newHerNode.pre = temp.next
		if temp.next != nil { //这里需要注意
			temp.next.pre = newHerNode
		}
		temp.next = newHerNode
	}
}

// 删除一个结点
func (head *HeroNode) DelHeroNode(id int) {
	//先找到该链表的最后一个结点
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	//让寻找的结点no，和temp的下一个结点的no比较
	flag := false
	for {
		if temp.next == nil { //表示找到最后
			break
		} else if temp.next.no == id {
			//说明我们找到了
			flag = true
			break
		}
		temp = temp.next
	}
	if flag { //找到，删除
		temp.next = temp.next.next
		if temp.next != nil { //这里需要注意
			temp.next.pre = temp
		}
	} else {
		fmt.Println("没有找到")
	}
}

// 修改链表信息
func (head *HeroNode) ExcHeroNode(id int) {
	//先找到该链表的最后一个结点
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	//让插入的结点no，和temp的下一个结点的no比较
	flag := false
	for {
		if temp.next == nil { //表示找到最后
			break
		} else if temp.next.no == id {
			//说明我们找到了
			flag = true
			break
		}
		temp = temp.next
	}
	if flag { //找到，删除
		var name string
		var nickname string
		fmt.Println("请输入要修改成什么名字和昵称")
		name = "林冲"
		nickname = "豹子头"
		//fmt.Scanln(&name)
		//fmt.Scanln(&nickname)
		temp.next.name = name
		temp.next.nickname = nickname
	} else {
		fmt.Println("没有找到")
	}
}

// 显示链表的所有信息
func (head *HeroNode) ListHeroNode() {
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	//先判断该链表是不是一个空的链表
	if temp.next == nil {
		fmt.Println("空空如也....")
		return
	}
	//遍历这个链表
	for {
		fmt.Printf("[%d, %s, %s]==>", temp.next.no, temp.next.name, temp.next.nickname)
		//判断是否到链表尾部了
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

// 显示链表的所有信息(反向)
func (head *HeroNode) ListHeroNode2() {
	//创建一个辅助结点[跑龙套, 帮忙]
	temp := head
	//先判断该链表是不是一个空的链表

	if temp.next == nil {
		fmt.Println("空空如也....")
		return
	}
	//遍历这个链表
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	for {
		fmt.Printf("[%d, %s, %s]==>", temp.no, temp.name, temp.nickname)
		//判断是否到链表头部了
		temp = temp.pre
		if temp.pre == nil {
			break
		}
	}
}
func Testmain() {
	//先创建一个头节点
	head := &HeroNode{}
	//创建一个新的HeroNode
	hero1 := &HeroNode{
		no:       1,
		name:     "宋江",
		nickname: "及时雨",
	}
	hero2 := &HeroNode{
		no:       2,
		name:     "卢俊义",
		nickname: "玉麒麟",
	}
	hero3 := &HeroNode{
		no:       3,
		name:     "吴用",
		nickname: "智多星",
	}
	hero4 := &HeroNode{
		no:       4,
		name:     "李逵",
		nickname: "黑旋风",
	}
	head.InserHeroNode(hero1)
	head.InserHeroNode(hero2)
	head.InserHeroNode(hero3)
	head.InserHeroNode(hero4)
	head.ListHeroNode()
	fmt.Println()
	head.ListHeroNode2()
	//加入
	head.InserHeroNode2(hero1)
	head.InserHeroNode2(hero4)
	head.InserHeroNode2(hero2)
	head.InserHeroNode2(hero3)
	//显示
	head.ListHeroNode()
	fmt.Println()
	head.DelHeroNode(2)
	head.ListHeroNode()
	fmt.Println()
	head.ExcHeroNode(3)
	head.ListHeroNode()
}
